package br.com.cast.notaFiscal.notaFiscal.paginas;

import org.apache.wicket.AttributeModifier;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.navigation.paging.PagingNavigator;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.data.DataView;
import org.apache.wicket.spring.injection.annot.SpringBean;

import br.com.cast.notaFiscal.HomePage;
import br.com.cast.notaFiscal.models.NotaFiscal;
import br.com.cast.notaFiscal.models.Produto;
import br.com.cast.notaFiscal.services.INotaFiscalService;
import br.com.cast.notaFiscal.util.ComponentUtil;

public class ListarNotaFiscal extends Panel {

	private static final long serialVersionUID = 1L;
	@SpringBean
	private INotaFiscalService notaFiscalService;
	private CadastroNotaFiscal cadastroNotaFiscal;

	public ListarNotaFiscal(String id) {
		super(id);
		cadastroNotaFiscal = new CadastroNotaFiscal(HomePage.ID_CONTEUDO);
		criaLinkIncluir();

		DataView<NotaFiscal> dataView = criaDataView();

		criaPaginacao(dataView);
	}

	private void criaPaginacao(DataView<NotaFiscal> dataView) {
		add(new PagingNavigator("paginacao", dataView));
	}

	private DataView<NotaFiscal> criaDataView() {
		DataView<NotaFiscal> dataView = new DataView<NotaFiscal>("notas",
				notaFiscalService) {

			@SuppressWarnings("rawtypes")
			@Override
			protected void populateItem(final Item<NotaFiscal> item) {

				if (item.getIndex() % 2 != 0) {
					// para linhas impares adiciona um estilo diferente.
					// o indice começa no zero
					item.add(AttributeModifier.replace("class", "alt"));
				}

				item.add(new Label("numero"));
				
				NotaFiscal notaFiscal = (NotaFiscal) item
						.getDefaultModelObject();

				ListView<Produto> listViewProdutos = new ListView<Produto>(
						"produtosNF", notaFiscal.getProdutos()) {

					@Override
					protected void populateItem(ListItem<Produto> item) {
						Produto prod = (Produto) item.getDefaultModelObject();
						item.add(new Label("descricao", prod.getDescricao()));
					}
				};

				item.add(listViewProdutos);

				item.add(new Link("alterar") {
					@Override
					public void onClick() {
						cadastroNotaFiscal.atualizaModel(item
								.getDefaultModelObject());
						redirecionaCadastro(cadastroNotaFiscal);
					}

				});

				item.add(new Link("excluir") {
					@Override
					public void onClick() {
						NotaFiscal notaFiscal = (NotaFiscal) item
								.getDefaultModelObject();
						notaFiscalService.excluir(notaFiscal);
						HomePage template = ComponentUtil.getTemplate(this);
						template.success("Registro excluído com sucesso!");
					}

				});

			}

		};

		dataView.setItemsPerPage(5);

		add(dataView);

		return dataView;
	}

	private void criaLinkIncluir() {
		add(new Link<Object>("incluir") {
			@Override
			public void onClick() {
				redirecionaCadastro(cadastroNotaFiscal);
			}
		});
	}

	private void redirecionaCadastro(final CadastroNotaFiscal cadastroNotaFiscal) {
		HomePage template = ComponentUtil.getTemplate(this);
		template.replace(cadastroNotaFiscal);
	}
}
